From: Jeroen van der Heijden Date: Fri, 30 Mar 2018 20:17:57 +0000 (+0200) Subject: Allow select * from * X-Git-Tag: archive/raspbian/2.0.44-1+rpi1~1^2~3^2~9^2~44 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=f584827c2a5f7c78740db1dd856a361e9a62ed41;p=siridb-server.git Allow select * from * --- diff --git a/grammar/gogrammar/grammar.go b/grammar/gogrammar/grammar.go index f33b4cc4..89053c28 100644 --- a/grammar/gogrammar/grammar.go +++ b/grammar/gogrammar/grammar.go @@ -4,7 +4,7 @@ package grammar // should be used with the goleri module. // // Source class: SiriGrammar -// Created at: 2018-03-30 13:58:06 +// Created at: 2018-03-30 21:57:58 import ( "regexp" @@ -51,6 +51,7 @@ const ( GidDropShards = iota GidDropStmt = iota GidDropUser = iota + GidFAll = iota GidFCount = iota GidFDerivative = iota GidFDifference = iota @@ -119,6 +120,7 @@ const ( GidKActiveHandles = iota GidKAddress = iota GidKAfter = iota + GidKAll = iota GidKAlter = iota GidKAnd = iota GidKAs = iota @@ -263,6 +265,7 @@ const ( GidSelectAggregate = iota GidSelectAggregates = iota GidSelectStmt = iota + GidSeriesAll = iota GidSeriesColumns = iota GidSeriesMatch = iota GidSeriesName = iota @@ -314,6 +317,7 @@ func SiriGrammar() *goleri.Grammar { kActiveHandles := goleri.NewKeyword(GidKActiveHandles, "active_handles", false) kAddress := goleri.NewKeyword(GidKAddress, "address", false) kAfter := goleri.NewKeyword(GidKAfter, "after", false) + kAll := goleri.NewKeyword(GidKAll, "all", false) kAlter := goleri.NewKeyword(GidKAlter, "alter", false) kAnd := goleri.NewKeyword(GidKAnd, "and", false) kAs := goleri.NewKeyword(GidKAs, "as", false) @@ -935,6 +939,12 @@ func SiriGrammar() *goleri.Grammar { kIntersection, kSymmetricDifference, ) + seriesAll := goleri.NewChoice( + GidSeriesAll, + false, + goleri.NewToken(NoGid, "*"), + kAll, + ) seriesName := goleri.NewRepeat(GidSeriesName, string, 1, 1) groupName := goleri.NewRepeat(GidGroupName, rGraveStr, 1, 1) seriesRe := goleri.NewRepeat(GidSeriesRe, rRegex, 1, 1) @@ -948,6 +958,7 @@ func SiriGrammar() *goleri.Grammar { seriesMatch := goleri.NewList(GidSeriesMatch, goleri.NewChoice( NoGid, false, + seriesAll, seriesName, groupMatch, seriesRe, @@ -985,12 +996,13 @@ func SiriGrammar() *goleri.Grammar { kSuffix, string, ) - fPoints := goleri.NewChoice( - GidFPoints, + fAll := goleri.NewChoice( + GidFAll, false, goleri.NewToken(NoGid, "*"), - kPoints, + kAll, ) + fPoints := goleri.NewRepeat(GidFPoints, kPoints, 1, 1) fDifference := goleri.NewSequence( GidFDifference, kDifference, @@ -1138,7 +1150,7 @@ func SiriGrammar() *goleri.Grammar { aggregateFunctions := goleri.NewList(GidAggregateFunctions, goleri.NewChoice( NoGid, false, - fPoints, + fAll, fLimit, fMean, fSum, @@ -1156,6 +1168,7 @@ func SiriGrammar() *goleri.Grammar { fDifference, fDerivative, fFilter, + fPoints, ), goleri.NewToken(NoGid, "=>"), 1, 0, false) selectAggregate := goleri.NewSequence( GidSelectAggregate, @@ -1593,53 +1606,65 @@ func SiriGrammar() *goleri.Grammar { ), goleri.NewToken(NoGid, ","), 0, 0, false), ) timeitStmt := goleri.NewRepeat(GidTimeitStmt, kTimeit, 1, 1) - helpShow := goleri.NewKeyword(GidHelpShow, "show", false) - helpNoaccess := goleri.NewKeyword(GidHelpNoaccess, "noaccess", false) + helpSelect := goleri.NewKeyword(GidHelpSelect, "select", false) + helpListGroups := goleri.NewKeyword(GidHelpListGroups, "groups", false) + helpListPools := goleri.NewKeyword(GidHelpListPools, "pools", false) + helpListShards := goleri.NewKeyword(GidHelpListShards, "shards", false) + helpListUsers := goleri.NewKeyword(GidHelpListUsers, "users", false) + helpListServers := goleri.NewKeyword(GidHelpListServers, "servers", false) + helpListSeries := goleri.NewKeyword(GidHelpListSeries, "series", false) + helpList := goleri.NewSequence( + GidHelpList, + kList, + goleri.NewOptional(NoGid, goleri.NewChoice( + NoGid, + true, + helpListGroups, + helpListPools, + helpListShards, + helpListUsers, + helpListServers, + helpListSeries, + )), + ) + helpAccess := goleri.NewKeyword(GidHelpAccess, "access", false) helpRevoke := goleri.NewKeyword(GidHelpRevoke, "revoke", false) - helpDropUser := goleri.NewKeyword(GidHelpDropUser, "user", false) helpDropGroup := goleri.NewKeyword(GidHelpDropGroup, "group", false) + helpDropSeries := goleri.NewKeyword(GidHelpDropSeries, "series", false) + helpDropUser := goleri.NewKeyword(GidHelpDropUser, "user", false) helpDropServer := goleri.NewKeyword(GidHelpDropServer, "server", false) helpDropShards := goleri.NewKeyword(GidHelpDropShards, "shards", false) - helpDropSeries := goleri.NewKeyword(GidHelpDropSeries, "series", false) helpDrop := goleri.NewSequence( GidHelpDrop, kDrop, goleri.NewOptional(NoGid, goleri.NewChoice( NoGid, true, - helpDropUser, helpDropGroup, + helpDropSeries, + helpDropUser, helpDropServer, helpDropShards, - helpDropSeries, )), ) - helpAlterUser := goleri.NewKeyword(GidHelpAlterUser, "user", false) - helpAlterServers := goleri.NewKeyword(GidHelpAlterServers, "servers", false) - helpAlterDatabase := goleri.NewKeyword(GidHelpAlterDatabase, "database", false) - helpAlterGroup := goleri.NewKeyword(GidHelpAlterGroup, "group", false) - helpAlterServer := goleri.NewKeyword(GidHelpAlterServer, "server", false) - helpAlter := goleri.NewSequence( - GidHelpAlter, - kAlter, + helpCreateUser := goleri.NewKeyword(GidHelpCreateUser, "user", false) + helpCreateGroup := goleri.NewKeyword(GidHelpCreateGroup, "group", false) + helpCreate := goleri.NewSequence( + GidHelpCreate, + kCreate, goleri.NewOptional(NoGid, goleri.NewChoice( NoGid, true, - helpAlterUser, - helpAlterServers, - helpAlterDatabase, - helpAlterGroup, - helpAlterServer, + helpCreateUser, + helpCreateGroup, )), ) - helpSelect := goleri.NewKeyword(GidHelpSelect, "select", false) - helpTimezones := goleri.NewKeyword(GidHelpTimezones, "timezones", false) helpCountGroups := goleri.NewKeyword(GidHelpCountGroups, "groups", false) helpCountPools := goleri.NewKeyword(GidHelpCountPools, "pools", false) - helpCountSeries := goleri.NewKeyword(GidHelpCountSeries, "series", false) + helpCountShards := goleri.NewKeyword(GidHelpCountShards, "shards", false) helpCountUsers := goleri.NewKeyword(GidHelpCountUsers, "users", false) helpCountServers := goleri.NewKeyword(GidHelpCountServers, "servers", false) - helpCountShards := goleri.NewKeyword(GidHelpCountShards, "shards", false) + helpCountSeries := goleri.NewKeyword(GidHelpCountSeries, "series", false) helpCount := goleri.NewSequence( GidHelpCount, kCount, @@ -1648,68 +1673,56 @@ func SiriGrammar() *goleri.Grammar { true, helpCountGroups, helpCountPools, - helpCountSeries, + helpCountShards, helpCountUsers, helpCountServers, - helpCountShards, + helpCountSeries, )), ) - helpFunctions := goleri.NewKeyword(GidHelpFunctions, "functions", false) - helpCreateUser := goleri.NewKeyword(GidHelpCreateUser, "user", false) - helpCreateGroup := goleri.NewKeyword(GidHelpCreateGroup, "group", false) - helpCreate := goleri.NewSequence( - GidHelpCreate, - kCreate, + helpNoaccess := goleri.NewKeyword(GidHelpNoaccess, "noaccess", false) + helpAlterServer := goleri.NewKeyword(GidHelpAlterServer, "server", false) + helpAlterDatabase := goleri.NewKeyword(GidHelpAlterDatabase, "database", false) + helpAlterGroup := goleri.NewKeyword(GidHelpAlterGroup, "group", false) + helpAlterServers := goleri.NewKeyword(GidHelpAlterServers, "servers", false) + helpAlterUser := goleri.NewKeyword(GidHelpAlterUser, "user", false) + helpAlter := goleri.NewSequence( + GidHelpAlter, + kAlter, goleri.NewOptional(NoGid, goleri.NewChoice( NoGid, true, - helpCreateUser, - helpCreateGroup, + helpAlterServer, + helpAlterDatabase, + helpAlterGroup, + helpAlterServers, + helpAlterUser, )), ) - helpGrant := goleri.NewKeyword(GidHelpGrant, "grant", false) + helpShow := goleri.NewKeyword(GidHelpShow, "show", false) + helpTimezones := goleri.NewKeyword(GidHelpTimezones, "timezones", false) helpTimeit := goleri.NewKeyword(GidHelpTimeit, "timeit", false) - helpAccess := goleri.NewKeyword(GidHelpAccess, "access", false) - helpListSeries := goleri.NewKeyword(GidHelpListSeries, "series", false) - helpListServers := goleri.NewKeyword(GidHelpListServers, "servers", false) - helpListPools := goleri.NewKeyword(GidHelpListPools, "pools", false) - helpListUsers := goleri.NewKeyword(GidHelpListUsers, "users", false) - helpListGroups := goleri.NewKeyword(GidHelpListGroups, "groups", false) - helpListShards := goleri.NewKeyword(GidHelpListShards, "shards", false) - helpList := goleri.NewSequence( - GidHelpList, - kList, - goleri.NewOptional(NoGid, goleri.NewChoice( - NoGid, - true, - helpListSeries, - helpListServers, - helpListPools, - helpListUsers, - helpListGroups, - helpListShards, - )), - ) + helpGrant := goleri.NewKeyword(GidHelpGrant, "grant", false) + helpFunctions := goleri.NewKeyword(GidHelpFunctions, "functions", false) help := goleri.NewSequence( GidHelp, kHelp, goleri.NewOptional(NoGid, goleri.NewChoice( NoGid, true, - helpShow, - helpNoaccess, + helpSelect, + helpList, + helpAccess, helpRevoke, helpDrop, + helpCreate, + helpCount, + helpNoaccess, helpAlter, - helpSelect, + helpShow, helpTimezones, - helpCount, - helpFunctions, - helpCreate, - helpGrant, helpTimeit, - helpAccess, - helpList, + helpGrant, + helpFunctions, )), ) START := goleri.NewSequence( diff --git a/grammar/grammar.py b/grammar/grammar.py index 2660cd0d..8edc7c3e 100644 --- a/grammar/grammar.py +++ b/grammar/grammar.py @@ -48,6 +48,7 @@ class SiriGrammar(Grammar): k_active_handles = Keyword('active_handles') k_address = Keyword('address') k_after = Keyword('after') + k_all = Keyword('all') k_alter = Keyword('alter') k_and = Keyword('and') k_as = Keyword('as') @@ -397,14 +398,21 @@ class SiriGrammar(Grammar): k_symmetric_difference, most_greedy=False) + series_all = Choice(Token('*'), k_all, most_greedy=False) series_name = Repeat(string, 1, 1) group_name = Repeat(r_grave_str, 1, 1) series_re = Repeat(r_regex, 1, 1) uuid = Choice(r_uuid_str, string, most_greedy=False) group_match = Repeat(r_grave_str, 1, 1) series_match = List( - Choice(Token('*'), series_name, group_match, series_re, most_greedy=False), - series_sep, 1) + Choice( + series_all, + series_name, + group_match, + series_re, + most_greedy=False), + series_sep, + 1) limit_expr = Sequence(k_limit, int_expr) before_expr = Sequence(k_before, time_expr) @@ -415,10 +423,9 @@ class SiriGrammar(Grammar): prefix_expr = Sequence(k_prefix, string) suffix_expr = Sequence(k_suffix, string) - f_points = Choice( - Token('*'), - k_points, - most_greedy=False) + f_all = Choice(Token('*'), k_all, most_greedy=False) + + f_points = Repeat(k_points, 1, 1) # DEPRECATED f_difference = Sequence( k_difference, @@ -503,7 +510,7 @@ class SiriGrammar(Grammar): ')') aggregate_functions = List(Choice( - f_points, + f_all, f_limit, f_mean, f_sum, @@ -521,6 +528,7 @@ class SiriGrammar(Grammar): f_difference, f_derivative, f_filter, + f_points, most_greedy=False), '=>', 1) select_aggregate = Sequence( diff --git a/include/siri/grammar/grammar.h b/include/siri/grammar/grammar.h index 0a97a1ce..2b747110 100644 --- a/include/siri/grammar/grammar.h +++ b/include/siri/grammar/grammar.h @@ -5,7 +5,7 @@ * should be used with the libcleri module. * * Source class: SiriGrammar - * Created at: 2018-03-30 13:58:06 + * Created at: 2018-03-30 21:57:58 */ #ifndef CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_ #define CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_ @@ -51,6 +51,7 @@ enum cleri_grammar_ids { CLERI_GID_DROP_SHARDS, CLERI_GID_DROP_STMT, CLERI_GID_DROP_USER, + CLERI_GID_F_ALL, CLERI_GID_F_COUNT, CLERI_GID_F_DERIVATIVE, CLERI_GID_F_DIFFERENCE, @@ -119,6 +120,7 @@ enum cleri_grammar_ids { CLERI_GID_K_ACTIVE_HANDLES, CLERI_GID_K_ADDRESS, CLERI_GID_K_AFTER, + CLERI_GID_K_ALL, CLERI_GID_K_ALTER, CLERI_GID_K_AND, CLERI_GID_K_AS, @@ -262,6 +264,7 @@ enum cleri_grammar_ids { CLERI_GID_SELECT_AGGREGATE, CLERI_GID_SELECT_AGGREGATES, CLERI_GID_SELECT_STMT, + CLERI_GID_SERIES_ALL, CLERI_GID_SERIES_COLUMNS, CLERI_GID_SERIES_MATCH, CLERI_GID_SERIES_NAME, diff --git a/src/siri/db/aggregate.c b/src/siri/db/aggregate.c index 62003607..25b1f181 100644 --- a/src/siri/db/aggregate.c +++ b/src/siri/db/aggregate.c @@ -423,7 +423,12 @@ slist_t * siridb_aggregate_list(cleri_children_t * children, char * err_msg) break; + case CLERI_GID_F_ALL: + break; + case CLERI_GID_F_POINTS: + log_warning("Keyword 'points' is deprecated, " + "use '*' or 'all' instead."); break; default: diff --git a/src/siri/grammar/grammar.c b/src/siri/grammar/grammar.c index fbd7c80a..f7e88b22 100644 --- a/src/siri/grammar/grammar.c +++ b/src/siri/grammar/grammar.c @@ -5,7 +5,7 @@ * should be used with the libcleri module. * * Source class: SiriGrammar - * Created at: 2018-03-30 13:58:06 + * Created at: 2018-03-30 21:57:58 */ #include "siri/grammar/grammar.h" @@ -33,6 +33,7 @@ cleri_grammar_t * compile_grammar(void) cleri_t * k_active_handles = cleri_keyword(CLERI_GID_K_ACTIVE_HANDLES, "active_handles", CLERI_CASE_SENSITIVE); cleri_t * k_address = cleri_keyword(CLERI_GID_K_ADDRESS, "address", CLERI_CASE_SENSITIVE); cleri_t * k_after = cleri_keyword(CLERI_GID_K_AFTER, "after", CLERI_CASE_SENSITIVE); + cleri_t * k_all = cleri_keyword(CLERI_GID_K_ALL, "all", CLERI_CASE_SENSITIVE); cleri_t * k_alter = cleri_keyword(CLERI_GID_K_ALTER, "alter", CLERI_CASE_SENSITIVE); cleri_t * k_and = cleri_keyword(CLERI_GID_K_AND, "and", CLERI_CASE_SENSITIVE); cleri_t * k_as = cleri_keyword(CLERI_GID_K_AS, "as", CLERI_CASE_SENSITIVE); @@ -733,6 +734,13 @@ cleri_grammar_t * compile_grammar(void) k_intersection, k_symmetric_difference ); + cleri_t * series_all = cleri_choice( + CLERI_GID_SERIES_ALL, + CLERI_FIRST_MATCH, + 2, + cleri_token(CLERI_NONE, "*"), + k_all + ); cleri_t * series_name = cleri_dup(CLERI_GID_SERIES_NAME, string); cleri_t * group_name = cleri_dup(CLERI_GID_GROUP_NAME, r_grave_str); cleri_t * series_re = cleri_dup(CLERI_GID_SERIES_RE, r_regex); @@ -747,7 +755,8 @@ cleri_grammar_t * compile_grammar(void) cleri_t * series_match = cleri_list(CLERI_GID_SERIES_MATCH, cleri_choice( CLERI_NONE, CLERI_FIRST_MATCH, - 3, + 4, + series_all, series_name, group_match, series_re @@ -791,13 +800,14 @@ cleri_grammar_t * compile_grammar(void) k_suffix, string ); - cleri_t * f_points = cleri_choice( - CLERI_GID_F_POINTS, + cleri_t * f_all = cleri_choice( + CLERI_GID_F_ALL, CLERI_FIRST_MATCH, 2, cleri_token(CLERI_NONE, "*"), - k_points + k_all ); + cleri_t * f_points = cleri_dup(CLERI_GID_F_POINTS, k_points); cleri_t * f_difference = cleri_sequence( CLERI_GID_F_DIFFERENCE, 4, @@ -964,8 +974,8 @@ cleri_grammar_t * compile_grammar(void) cleri_t * aggregate_functions = cleri_list(CLERI_GID_AGGREGATE_FUNCTIONS, cleri_choice( CLERI_NONE, CLERI_FIRST_MATCH, - 18, - f_points, + 19, + f_all, f_limit, f_mean, f_sum, @@ -982,7 +992,8 @@ cleri_grammar_t * compile_grammar(void) f_last, f_difference, f_derivative, - f_filter + f_filter, + f_points ), cleri_token(CLERI_NONE, "=>"), 1, 0, 0); cleri_t * select_aggregate = cleri_sequence( CLERI_GID_SELECT_AGGREGATE, @@ -1487,14 +1498,36 @@ cleri_grammar_t * compile_grammar(void) ), cleri_token(CLERI_NONE, ","), 0, 0, 0) ); cleri_t * timeit_stmt = cleri_dup(CLERI_GID_TIMEIT_STMT, k_timeit); - cleri_t * help_show = cleri_keyword(CLERI_GID_HELP_SHOW, "show", CLERI_CASE_SENSITIVE); - cleri_t * help_noaccess = cleri_keyword(CLERI_GID_HELP_NOACCESS, "noaccess", CLERI_CASE_SENSITIVE); + cleri_t * help_select = cleri_keyword(CLERI_GID_HELP_SELECT, "select", CLERI_CASE_SENSITIVE); + cleri_t * help_list_groups = cleri_keyword(CLERI_GID_HELP_LIST_GROUPS, "groups", CLERI_CASE_SENSITIVE); + cleri_t * help_list_pools = cleri_keyword(CLERI_GID_HELP_LIST_POOLS, "pools", CLERI_CASE_SENSITIVE); + cleri_t * help_list_shards = cleri_keyword(CLERI_GID_HELP_LIST_SHARDS, "shards", CLERI_CASE_SENSITIVE); + cleri_t * help_list_users = cleri_keyword(CLERI_GID_HELP_LIST_USERS, "users", CLERI_CASE_SENSITIVE); + cleri_t * help_list_servers = cleri_keyword(CLERI_GID_HELP_LIST_SERVERS, "servers", CLERI_CASE_SENSITIVE); + cleri_t * help_list_series = cleri_keyword(CLERI_GID_HELP_LIST_SERIES, "series", CLERI_CASE_SENSITIVE); + cleri_t * help_list = cleri_sequence( + CLERI_GID_HELP_LIST, + 2, + k_list, + cleri_optional(CLERI_NONE, cleri_choice( + CLERI_NONE, + CLERI_MOST_GREEDY, + 6, + help_list_groups, + help_list_pools, + help_list_shards, + help_list_users, + help_list_servers, + help_list_series + )) + ); + cleri_t * help_access = cleri_keyword(CLERI_GID_HELP_ACCESS, "access", CLERI_CASE_SENSITIVE); cleri_t * help_revoke = cleri_keyword(CLERI_GID_HELP_REVOKE, "revoke", CLERI_CASE_SENSITIVE); - cleri_t * help_drop_user = cleri_keyword(CLERI_GID_HELP_DROP_USER, "user", CLERI_CASE_SENSITIVE); cleri_t * help_drop_group = cleri_keyword(CLERI_GID_HELP_DROP_GROUP, "group", CLERI_CASE_SENSITIVE); + cleri_t * help_drop_series = cleri_keyword(CLERI_GID_HELP_DROP_SERIES, "series", CLERI_CASE_SENSITIVE); + cleri_t * help_drop_user = cleri_keyword(CLERI_GID_HELP_DROP_USER, "user", CLERI_CASE_SENSITIVE); cleri_t * help_drop_server = cleri_keyword(CLERI_GID_HELP_DROP_SERVER, "server", CLERI_CASE_SENSITIVE); cleri_t * help_drop_shards = cleri_keyword(CLERI_GID_HELP_DROP_SHARDS, "shards", CLERI_CASE_SENSITIVE); - cleri_t * help_drop_series = cleri_keyword(CLERI_GID_HELP_DROP_SERIES, "series", CLERI_CASE_SENSITIVE); cleri_t * help_drop = cleri_sequence( CLERI_GID_HELP_DROP, 2, @@ -1503,41 +1536,33 @@ cleri_grammar_t * compile_grammar(void) CLERI_NONE, CLERI_MOST_GREEDY, 5, - help_drop_user, help_drop_group, + help_drop_series, + help_drop_user, help_drop_server, - help_drop_shards, - help_drop_series + help_drop_shards )) ); - cleri_t * help_alter_user = cleri_keyword(CLERI_GID_HELP_ALTER_USER, "user", CLERI_CASE_SENSITIVE); - cleri_t * help_alter_servers = cleri_keyword(CLERI_GID_HELP_ALTER_SERVERS, "servers", CLERI_CASE_SENSITIVE); - cleri_t * help_alter_database = cleri_keyword(CLERI_GID_HELP_ALTER_DATABASE, "database", CLERI_CASE_SENSITIVE); - cleri_t * help_alter_group = cleri_keyword(CLERI_GID_HELP_ALTER_GROUP, "group", CLERI_CASE_SENSITIVE); - cleri_t * help_alter_server = cleri_keyword(CLERI_GID_HELP_ALTER_SERVER, "server", CLERI_CASE_SENSITIVE); - cleri_t * help_alter = cleri_sequence( - CLERI_GID_HELP_ALTER, + cleri_t * help_create_user = cleri_keyword(CLERI_GID_HELP_CREATE_USER, "user", CLERI_CASE_SENSITIVE); + cleri_t * help_create_group = cleri_keyword(CLERI_GID_HELP_CREATE_GROUP, "group", CLERI_CASE_SENSITIVE); + cleri_t * help_create = cleri_sequence( + CLERI_GID_HELP_CREATE, 2, - k_alter, + k_create, cleri_optional(CLERI_NONE, cleri_choice( CLERI_NONE, CLERI_MOST_GREEDY, - 5, - help_alter_user, - help_alter_servers, - help_alter_database, - help_alter_group, - help_alter_server + 2, + help_create_user, + help_create_group )) ); - cleri_t * help_select = cleri_keyword(CLERI_GID_HELP_SELECT, "select", CLERI_CASE_SENSITIVE); - cleri_t * help_timezones = cleri_keyword(CLERI_GID_HELP_TIMEZONES, "timezones", CLERI_CASE_SENSITIVE); cleri_t * help_count_groups = cleri_keyword(CLERI_GID_HELP_COUNT_GROUPS, "groups", CLERI_CASE_SENSITIVE); cleri_t * help_count_pools = cleri_keyword(CLERI_GID_HELP_COUNT_POOLS, "pools", CLERI_CASE_SENSITIVE); - cleri_t * help_count_series = cleri_keyword(CLERI_GID_HELP_COUNT_SERIES, "series", CLERI_CASE_SENSITIVE); + cleri_t * help_count_shards = cleri_keyword(CLERI_GID_HELP_COUNT_SHARDS, "shards", CLERI_CASE_SENSITIVE); cleri_t * help_count_users = cleri_keyword(CLERI_GID_HELP_COUNT_USERS, "users", CLERI_CASE_SENSITIVE); cleri_t * help_count_servers = cleri_keyword(CLERI_GID_HELP_COUNT_SERVERS, "servers", CLERI_CASE_SENSITIVE); - cleri_t * help_count_shards = cleri_keyword(CLERI_GID_HELP_COUNT_SHARDS, "shards", CLERI_CASE_SENSITIVE); + cleri_t * help_count_series = cleri_keyword(CLERI_GID_HELP_COUNT_SERIES, "series", CLERI_CASE_SENSITIVE); cleri_t * help_count = cleri_sequence( CLERI_GID_HELP_COUNT, 2, @@ -1548,52 +1573,38 @@ cleri_grammar_t * compile_grammar(void) 6, help_count_groups, help_count_pools, - help_count_series, + help_count_shards, help_count_users, help_count_servers, - help_count_shards + help_count_series )) ); - cleri_t * help_functions = cleri_keyword(CLERI_GID_HELP_FUNCTIONS, "functions", CLERI_CASE_SENSITIVE); - cleri_t * help_create_user = cleri_keyword(CLERI_GID_HELP_CREATE_USER, "user", CLERI_CASE_SENSITIVE); - cleri_t * help_create_group = cleri_keyword(CLERI_GID_HELP_CREATE_GROUP, "group", CLERI_CASE_SENSITIVE); - cleri_t * help_create = cleri_sequence( - CLERI_GID_HELP_CREATE, + cleri_t * help_noaccess = cleri_keyword(CLERI_GID_HELP_NOACCESS, "noaccess", CLERI_CASE_SENSITIVE); + cleri_t * help_alter_server = cleri_keyword(CLERI_GID_HELP_ALTER_SERVER, "server", CLERI_CASE_SENSITIVE); + cleri_t * help_alter_database = cleri_keyword(CLERI_GID_HELP_ALTER_DATABASE, "database", CLERI_CASE_SENSITIVE); + cleri_t * help_alter_group = cleri_keyword(CLERI_GID_HELP_ALTER_GROUP, "group", CLERI_CASE_SENSITIVE); + cleri_t * help_alter_servers = cleri_keyword(CLERI_GID_HELP_ALTER_SERVERS, "servers", CLERI_CASE_SENSITIVE); + cleri_t * help_alter_user = cleri_keyword(CLERI_GID_HELP_ALTER_USER, "user", CLERI_CASE_SENSITIVE); + cleri_t * help_alter = cleri_sequence( + CLERI_GID_HELP_ALTER, 2, - k_create, + k_alter, cleri_optional(CLERI_NONE, cleri_choice( CLERI_NONE, CLERI_MOST_GREEDY, - 2, - help_create_user, - help_create_group + 5, + help_alter_server, + help_alter_database, + help_alter_group, + help_alter_servers, + help_alter_user )) ); - cleri_t * help_grant = cleri_keyword(CLERI_GID_HELP_GRANT, "grant", CLERI_CASE_SENSITIVE); + cleri_t * help_show = cleri_keyword(CLERI_GID_HELP_SHOW, "show", CLERI_CASE_SENSITIVE); + cleri_t * help_timezones = cleri_keyword(CLERI_GID_HELP_TIMEZONES, "timezones", CLERI_CASE_SENSITIVE); cleri_t * help_timeit = cleri_keyword(CLERI_GID_HELP_TIMEIT, "timeit", CLERI_CASE_SENSITIVE); - cleri_t * help_access = cleri_keyword(CLERI_GID_HELP_ACCESS, "access", CLERI_CASE_SENSITIVE); - cleri_t * help_list_series = cleri_keyword(CLERI_GID_HELP_LIST_SERIES, "series", CLERI_CASE_SENSITIVE); - cleri_t * help_list_servers = cleri_keyword(CLERI_GID_HELP_LIST_SERVERS, "servers", CLERI_CASE_SENSITIVE); - cleri_t * help_list_pools = cleri_keyword(CLERI_GID_HELP_LIST_POOLS, "pools", CLERI_CASE_SENSITIVE); - cleri_t * help_list_users = cleri_keyword(CLERI_GID_HELP_LIST_USERS, "users", CLERI_CASE_SENSITIVE); - cleri_t * help_list_groups = cleri_keyword(CLERI_GID_HELP_LIST_GROUPS, "groups", CLERI_CASE_SENSITIVE); - cleri_t * help_list_shards = cleri_keyword(CLERI_GID_HELP_LIST_SHARDS, "shards", CLERI_CASE_SENSITIVE); - cleri_t * help_list = cleri_sequence( - CLERI_GID_HELP_LIST, - 2, - k_list, - cleri_optional(CLERI_NONE, cleri_choice( - CLERI_NONE, - CLERI_MOST_GREEDY, - 6, - help_list_series, - help_list_servers, - help_list_pools, - help_list_users, - help_list_groups, - help_list_shards - )) - ); + cleri_t * help_grant = cleri_keyword(CLERI_GID_HELP_GRANT, "grant", CLERI_CASE_SENSITIVE); + cleri_t * help_functions = cleri_keyword(CLERI_GID_HELP_FUNCTIONS, "functions", CLERI_CASE_SENSITIVE); cleri_t * help = cleri_sequence( CLERI_GID_HELP, 2, @@ -1602,20 +1613,20 @@ cleri_grammar_t * compile_grammar(void) CLERI_NONE, CLERI_MOST_GREEDY, 14, - help_show, - help_noaccess, + help_select, + help_list, + help_access, help_revoke, help_drop, + help_create, + help_count, + help_noaccess, help_alter, - help_select, + help_show, help_timezones, - help_count, - help_functions, - help_create, - help_grant, help_timeit, - help_access, - help_list + help_grant, + help_functions )) ); cleri_t * START = cleri_sequence( diff --git a/src/siri/parser/listener.c b/src/siri/parser/listener.c index 3ea5f261..acdfd314 100644 --- a/src/siri/parser/listener.c +++ b/src/siri/parser/listener.c @@ -1318,6 +1318,69 @@ static void enter_series_match(uv_async_t * handle) SIRIPARSER_NEXT_NODE } +static void enter_series_all(uv_async_t * handle) +{ + siridb_query_t * query = (siridb_query_t *) handle->data; + siridb_t * siridb = ((sirinet_socket_t *) query->client->data)->siridb; + cleri_node_t * node = query->nodes->node; + query_wrapper_t * q_wrapper = (query_wrapper_t *) query->data; + + /* we must send this query to all pools */ + if (q_wrapper->pmap != NULL) + { + imap_free(q_wrapper->pmap, NULL); + q_wrapper->pmap = NULL; + } + + if (q_wrapper->update_cb != NULL) + { + (*q_wrapper->update_cb)( + q_wrapper->series_map, + q_wrapper->series_tmp, + (imap_free_cb) &siridb__series_decref); + } + q_wrapper->series_tmp = NULL; + + uv_mutex_lock(&siridb->series_mutex); + + q_wrapper->slist = imap_2slist_ref( + ( q_wrapper->update_cb == NULL || + q_wrapper->update_cb == &imap_union_ref || + q_wrapper->update_cb == &imap_symmetric_difference_ref) ? + siridb->series_map : q_wrapper->series_map); + + uv_mutex_unlock(&siridb->series_mutex); + + q_wrapper->series_tmp = (q_wrapper->update_cb == NULL) ? + q_wrapper->series_map : imap_new(); + + if (q_wrapper->slist == NULL || q_wrapper->series_tmp == NULL) + { + MEM_ERR_RET + } + + uv_async_t * next = + (uv_async_t *) malloc(sizeof(uv_async_t)); + + if (next == NULL) + { + MEM_ERR_RET + } + + next->data = handle->data; + + uv_async_init( + siri.loop, + next, + (uv_async_cb) async_series_re); + uv_async_send(next); + + uv_close((uv_handle_t *) handle, (uv_close_cb) free); + } + + /* handle is handled or a signal is raised */ +} + static void enter_series_re(uv_async_t * handle) { siridb_query_t * query = (siridb_query_t *) handle->data; @@ -3228,8 +3291,6 @@ static void exit_series_match(uv_async_t * handle) q_select->points_map = imap_new(); } - LOGC("exit series match %zu (%u)", q_select->nselects, q_select->flags); - SIRIPARSER_ASYNC_NEXT_NODE }